"""基于Xu Liheng论文的不变量构建导航数据库，其定义见于论文：[1] Xu Liheng, Jiang Jie, Ma Yan. Ellipse crater recognition for Lost-in-space Scenario[J]. Remote Sensing, 2022, 14(23):6027
"""

import numpy as np
from .base import BinadHierarchyBuilder


class XuHierarchyBuilder(BinadHierarchyBuilder):
    """
    使用普通方式构建的导航数据库，即不作任何删减，只将原始数据按视场大小划分
    划分方式为最高点处反投影对角线，在当前平面上的最大长度，事先计算好。
    """

    def invariant(self, C1, C2):
        """
        本函数需要并行化计算
        """
        assert len(C1.shape) == 3 and len(C2.shape) == 3
        # 直接除以行列式是不对滴，参见文献[1] Gros P. , Quan L. .Projective invariants for Vision[R].1992:47
        C1 = C1.repeat(len(C2), axis=0)
        det = np.linalg.det(C1) / np.linalg.det(C2)
        I1 = np.trace(C1 @ np.linalg.inv(C2), axis1=1, axis2=2) ** 3 / det
        I2 = np.trace(C2 @ np.linalg.inv(C1), axis1=1, axis2=2) ** 3 * det
        return I1, I2
